home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / cp2dekit / samples / binfstd.cpp < prev    next >
C/C++ Source or Header  |  1996-12-29  |  2KB  |  96 lines

  1. //***************************************************************************
  2. //
  3. // this file is (c) '94-'96 Niklas Beisert
  4. //
  5. // this file is part of the cubic player development kit.
  6. // you may only use/modify/spread this file under the terms stated
  7. // in the cubic player development kit accompanying documentation.
  8. //
  9. //***************************************************************************
  10.  
  11.  
  12. #include <io.h>
  13. #include <fcntl.h>
  14. #include <sys\stat.h>
  15. #include "binfile.h"
  16.  
  17. sbinfile::sbinfile()
  18. {
  19. }
  20.  
  21. int sbinfile::open(const char *name, int type)
  22. {
  23.   close();
  24.   int fmode=canread|canseek;
  25.   switch (type)
  26.   {
  27.   case openro: handle=::open(name, O_RDONLY|O_BINARY); break;
  28.   case openrw: handle=::open(name, O_RDWR|O_BINARY); fmode|=canwrite|canchsize; break;
  29.   case opencr: handle=::open(name, O_RDWR|O_BINARY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE); fmode|=canwrite|canchsize; break;
  30.   case opencrn: handle=::open(name, O_RDWR|O_BINARY|O_CREAT|O_TRUNC|O_EXCL, S_IREAD|S_IWRITE); fmode|=canwrite|canchsize; break;
  31.   default: return 0;
  32.   }
  33.   if (handle<0)
  34.     return 0;
  35.   filepos=0;
  36.   filelen=::filelength(handle);
  37.   mode=fmode;
  38.   return 1;
  39. }
  40.  
  41. void sbinfile::close()
  42. {
  43.   if (mode)
  44.     ::close(handle);
  45.   binfile::close();
  46. }
  47.  
  48. long sbinfile::read(void *buf, long len)
  49. {
  50.   if (!(mode&canread))
  51.     return 0;
  52.   len=::read(handle, buf, len);
  53.   filepos+=len;
  54.   return len;
  55. }
  56.  
  57. long sbinfile::write(const void *buf, long len)
  58. {
  59.   if (!(mode&canwrite))
  60.     return 0;
  61.   if (!(mode&canchsize))
  62.     if (len>(filelen-filepos))
  63.       len=filelen-filepos;
  64.  
  65.   len=::write(handle, buf, len);
  66.   filepos+=len;
  67.   if (filepos>filelen)
  68.     filelen=filepos;
  69.   return len;
  70. }
  71.  
  72. long sbinfile::seek(long pos)
  73. {
  74.   if (!(mode&canseek))
  75.     return filepos;
  76.   if (pos<0)
  77.     pos=0;
  78.   if (pos>filelen)
  79.     pos=filelen;
  80.   if (pos==filepos)
  81.     return filepos;
  82.   filepos=pos;
  83.   ::lseek(handle, pos, SEEK_SET);
  84.   return filepos;
  85. }
  86.  
  87. long sbinfile::chsize(long pos)
  88. {
  89.   if (!(mode&canchsize))
  90.     return filelen;
  91.   ::chsize(handle, pos);
  92.   filelen=::filelength(handle);
  93.   filepos=::tell(handle);
  94.   return filelen;
  95. }
  96.